package org.example.advice;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.example.Service.UserService;
import org.example.Service.impl.UserServiceimpl;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import java.util.Arrays;


//相当于制造代理类的模板

@Component//根据这个注解，可以创建bean对象
@Aspect //通知类  意思就是增强类
public class MyAdvice {
    //
    //此语法用来说明  * 代表 单个返回值                              get * 表示以get开头的方法  ..表示可能有形参
    @Pointcut("execution( * org.example.Service.impl.UserServiceimpl.get*(..))")
    public void myPointcut() {}//把这个切点 赋给这个方法 引用这个方法就相当于 掉这个切点

    //通知类
    @Around("myPointcut()")
    public Object addss(ProceedingJoinPoint joinPoint) throws Throwable {

        System.out.println("环绕通知开始");
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++) {
            joinPoint.proceed(); //将主线任务循环十万次
        }
        long end = System.currentTimeMillis();
        System.out.println("用时" + (end - start));
        System.out.println("环绕通知接收");

        Signature signature = joinPoint.getSignature();
        System.out.println(signature.getDeclaringType());//获取当前连接点的路径
        System.out.println(signature.getName());//获取当前连接点的名字

        return null;
    }










    /*@Before("myPointcut()")//
    // 相当于把需要进行增强的方法传递过来  前置通知  在业务执行前增强
    public void addpluss(JoinPoint jP) {//这里写具体增强了什么
        Object[] args = jP.getArgs(); // 为了保证 传递来的参数可能有多个 这里使用数组来接收
        System.out.println("增强版plus"+ Arrays.toString(args));
    }*/

   /* @AfterReturning(value = "myPointcut()",returning = "s")//取得返回值后增强
    // 相当于把需要进行增强的方法传递过来  前置通知  在业务执行前增强
    public void addplusss(String s) {  //这里的变量名s 应与 returning 的变量名一致
        //这里写具体增强了什么
        System.out.println("增强版plus,取得返回值"+s);
    }*/



}
